前幾天我們討論了如何開啟專案,就有許多朋友再問了,使用預設的EA範例後跑出了一堆函式,像是什麼Oninit、OnDeinit...,這些函式的用途是什麼,怎麼用? 那今天就先來講一下他們的用法跟用在哪吧!
這是我範例出現的程式
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit(){
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick(){
}
//+------------------------------------------------------------------+
//| Trade function |
//+------------------------------------------------------------------+
void OnTrade(){
}
當在MT5平台中啟動一個 EA 時,OnInit() 函數會被執行一次,也只會執行一次。這個事件通常用於執行一些初始化操作,例如設定變數的初始值、載入設定或者進行其他必要的工作。而如果EA屬性、圖表符號或間期改變,EA會重新初始化,且OnInit()會再次運行。
int OnInit()
{
// 設定交易手數
Lots = 0.1; // 這裡假設手數為 0.1
// 設定止損和止盈水平
StopLoss = 30; // 假設止損為 30 點
TakeProfit = 50; // 假設止盈為 50 點
// 設定其他相關參數
return(INIT_SUCCEEDED); 返回 INIT_SUCCEEDED 表示初始化成功
}
當在MT5平台中停止或移除一個 EA ,或是商品圖表、間期更改時,OnDeinit 函數會被執行一次。這個事件通常用於進行一些清理工作,例如釋放資源、關閉連接等。
void OnDeinit(const int reason)
{
if(reason == REASON_REMOVE)
{
// EA 被移除的情況下執行的清理操作
}
else if(reason == REASON_CHARTCLOSE)
{
// 圖表被關閉的情況下執行的清理操作
}
// 其他情況下的清理操作
// 通常不需要返回任何值
}
在這個函數中,reason參數是一個整數值,代表了引發去初始化事件的具體情景。這個參數可以用來區分不同的去初始化情景,可以針對不同的情況執行相應的操作。
以下是一些可能的 reason 值及其含義:
REASON_REMOVE:EA 被從圖表上移除。
REASON_RECOMPILE:EA 正在重新編譯。
REASON_CHARTCHANGE:圖表的時間框架發生變化。
REASON_CHARTCLOSE:圖表被關閉。
REASON_PARAMETERS:EA 參數被修改。
市場上的價格發生變動(即NewTick發生)時,OnTick 事件就會被觸發,而一秒、一分鐘的價格可能變化數次,所以這個部分運行次數也會最多。這個事件通常用於執行與價格變動相關的交易邏輯,是最重要的函數,幾乎所有交易系統邏輯都發生在這。
void OnTick()
{
double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); // 獲取當前的買價
// 在這裡可以添加你的交易邏輯
if(currentPrice > 1.2000)
{
// 如果當前價格大於 1.2000,執行相應的交易操作
// 例如:開倉、平倉、修改訂單等
}
}
在交易操作發生(即order pool發生變化)時,OnTrade 事件就會觸發,它通常用於處理交易相關的邏輯,例如下單、平倉、修改訂單或觸發掛單的執行情況,屬於依需求選用的。
void OnTrade()
{
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
ulong ticket = OrderGetTicket(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY));
double profit = OrderGetDouble(ORDER_PROFIT);
Print("訂單 #", ticket, " 的盈利為:", profit);
}
}
以上便是範例EA出現的四個函數的解說,因為我還不會其他函式的使用,所以OnTrade OnTick的範例應用是由ChatGPT生成,剩下還有一些前置處理指示詞、定義指令之類的,就明天再分享啦!